package main

/** go版本：go1.22.2 */

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"
)

type TabItem struct {
    Tab  string       `json:"tab"`
    List []SubTabItem `json:"list"`
}

type SubTabItem struct {
    Title string    `json:"title"`
    Nav   []NavItem `json:"nav"`
}

type NavItem struct {
    Name string `json:"name"`
    Url  string `json:"url"`
}

func main() {
    // 将 json格式 转成 md格式
    fmt.Println("start...")

    // 读取文件
    filename := "ruancang.net.json"
    content, err := read(filename)
    if err != nil {
        fmt.Println("read err: ", err)
        return
    }

    if len(content) == 0 {
        fmt.Println("content is empty")
        return
    }

    // 转成json
    jsonData, err := toJson(content)
    if err != nil {
        fmt.Println("toJson err: ", err)
        return
    }

    if len(jsonData) == 0 {
        fmt.Println("jsonData is empty")
        return
    }

    // fmt.Printf("%+v", jsonData)

    // 转成字符串
    result := toString(jsonData)
    if len(result) == 0 {
        fmt.Println("toString is empty")
        return
    }

    // 写入文件
    filename = "software-list.md"
    err = write(filename, result)
    if err != nil {
        fmt.Println("write err: ", err)
        return
    }

    fmt.Println("end...")
}

// 读取文件
func read(filename string) (result []byte, err error) {
    f, err := os.Open(filename)
    if err != nil {
        return
    }

    defer f.Close()

    result, err = ioutil.ReadAll(f)
    return
}

// 转成json
func toJson(data []byte) (result []TabItem, err error) {
    err = json.Unmarshal(data, &result)
    return
}

// 转成字符串
func toString(data []TabItem) (result string) {
    for _, d := range data {
        result += fmt.Sprintf("* %s  \n", d.Tab)
        for _, l := range d.List {
            result += fmt.Sprintf("  * %s  \n", l.Title)
            for _, n := range l.Nav {
                result += fmt.Sprintf("    * [%s](%s)  \n", n.Name, n.Url)
            }
        }
    }
    return
}

// 写入文件
func write(filename string, data string) (err error) {
    f, err := os.OpenFile(filename, os.O_CREATE, 0644)
    if err != nil {
        return
    }

    defer f.Close()

    _, err = f.Write([]byte(data))
    return
}